package Comprehensive_04;

public class Test1 {
    public static void main(String[] args) {
        //3.1、创建账户类Account的对象,初始化余额为1000元
        Account account = new Account(1000);
        //3.2、创建线程任务Transfer类的对象，传递账户类Account的对象
        Transfer transfer = new Transfer(account);
        //3.3、创建2个Thread类的对象，传递线程任务Transfer类的对象并指定线程名称
        Thread t1 = new Thread(transfer,"小王");
        Thread t2 = new Thread(transfer,"小李");
        //3.4、2个Thread类的对象分别调用start方法，开启线程
        t1.start();
        t2.start();
    }
}

//1、定义银行账户Account类
class Account {
    //1.1、 定义int类型成员变量leftMoney，代表账户余额
    private int leftMoney;
    //1.2、 定义构造方法，给账户初始化
    public Account(int leftMoney) {
        this.leftMoney = leftMoney;
    }
    //1.3、 定义deposit方法，给账户存钱
    public void deposit(int money) {
        leftMoney += money;
    }
    //1.4、 定义getLeftMoney方法，查看账户余额
    public int getLeftMoney() {// 查询账户余额
        return leftMoney;
    }
}

//2、定义线程任务类Transfer,实现Runnable接口
class Transfer implements Runnable {
    //2.1、定义Account类型成员变量account
    private Account account;
    //2.2、定义构造方法，给成员变量account赋值
    public Transfer(Account account) {
        this.account = account;
    }
    //2.3、覆盖重写run方法（使用同步方法或同步代码块保证数据安全），
    //方法内部使用for循环，执行10次存钱，并打印账户余额的操作
    //同步方法
    public void run() {
        for (int i = 0; i < 10; i++) {// 向账户中存入100次钱
            //调用同步方法
            transfer();
        }
    }
    //同步方法
    public synchronized void transfer() {
        account.deposit(100);// 向账户中存入100块钱
        System.out.println(Thread.currentThread().getName()+" 存入100元后,账户的余额是: "+account.getLeftMoney());
    }

    /*
    //使用同步代码块
    public void run() {
    	for (int i = 0; i < 10; i++) {// 向账户中存入100次钱
        	synchronized(this){
            account.deposit(100);// 向账户中存入100块钱
            System.out.println(Thread.currentThread().getName()+" 存入100元后,账户的余额是: "+account.getLeftMoney());
       		}
        }

    }
    */
}